package com.sheng.leetcode.year2023.month08.day02;

import org.junit.Test;

import java.util.HashSet;
import java.util.Set;

/**
 * @author liusheng
 * @date 2023/08/02
 * <p>
 * 822. 翻转卡片游戏<p>
 * <p>
 * 在桌子上有 N 张卡片，每张卡片的正面和背面都写着一个正数（正面与背面上的数有可能不一样）。<p>
 * 我们可以先翻转任意张卡片，然后选择其中一张卡片。<p>
 * 如果选中的那张卡片背面的数字 X 与任意一张卡片的正面的数字都不同，那么这个数字是我们想要的数字。<p>
 * 哪个数是这些想要的数字中最小的数（找到这些数中的最小值）呢？如果没有一个数字符合要求的，输出 0。<p>
 * 其中, fronts[i] 和 backs[i] 分别代表第 i 张卡片的正面和背面的数字。<p>
 * 如果我们通过翻转卡片来交换正面与背面上的数，那么当初在正面的数就变成背面的数，背面的数就变成正面的数。<p>
 * <p>
 * 示例：<p>
 * 输入：fronts = [1,2,4,4,7], backs = [1,3,4,1,3]<p>
 * 输出：2<p>
 * 解释：假设我们翻转第二张卡片，那么在正面的数变成了 [1,3,4,4,7] ， 背面的数变成了 [1,2,4,1,3]。<p>
 * 接着我们选择第二张卡片，因为现在该卡片的背面的数是 2，2 与任意卡片上正面的数都不同，所以 2 就是我们想要的数字。<p>
 * <p>
 * 提示：<p>
 * 1 <= fronts.length == backs.length <= 1000<p>
 * 1 <= fronts[i] <= 2000<p>
 * 1 <= backs[i] <= 2000<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/card-flipping-game">822. 翻转卡片游戏</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode0822 {

    @Test
    public void test01() {
        int[] fronts = {1, 2, 4, 4, 7}, backs = {1, 3, 4, 1, 3};
        System.out.println(new Solution().flipgame(fronts, backs));
    }
}

class Solution {
    public int flipgame(int[] fronts, int[] backs) {
        // 数组 fronts 和 backs 中存在一个元素，满足对位不相同的同时，正背不同时相同即可
        int n = fronts.length;
        int ans = 0;
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < n; i++) {
            // 将正背面重复的数字记录下来
            if (fronts[i] == backs[i]) {
                set.add(fronts[i]);
            }
        }
        for (int i = 0; i < n; i++) {
            // 不是重复数字时判断最小值
            if (!set.contains(fronts[i])) {
                ans = ans == 0 ? fronts[i] : Math.min(ans, fronts[i]);
            }
            if (!set.contains(backs[i])) {
                ans = ans == 0 ? backs[i] : Math.min(ans, backs[i]);
            }
        }
        return ans;
    }
}
